package cn.itcast.openai;

import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.chat.completions.*;

import java.util.ArrayList;
import java.util.List;

/**
 * 智能课程推荐助手（支持多轮对话、多模型切换）
 *
 * @author zzw
 */
public class AICourseAssistant {
    private OpenAIClient client;
    private final List<ChatCompletionMessageParam> chatHistory = new ArrayList<>();
    // 默认模型
    private String currentModel = "qwen-plus";

    // 系统提示词（可扩展为多语言）
    private static final String SYSTEM_PROMPT = """
                                                你是一个专业的课程推荐助手，请按以下步骤工作：
                                                1. 收集用户信息：年龄、学历、编程基础、兴趣方向
                                                2. 根据信息推荐最合适的3门课程
                                                3. 当用户说"立即下单"时生成订单
                                                
                                                回复格式要求：
                                                - 信息收集阶段用"请告诉我您的xx"
                                                - 推荐时显示课程名称、价格、适用人群
                                                - 订单包含课程名称、价格、支付链接
                                                """;

    public AICourseAssistant(String apiKey, String baseUrl) {
        initClient(apiKey, baseUrl);
        initSystemMessage();
    }

    // 初始化客户端（支持复用）
    private void initClient(String apiKey, String baseUrl) {
        this.client = OpenAIOkHttpClient.builder()
                                        .baseUrl(baseUrl)
                                        .apiKey(apiKey)
                                        .build();
    }

    // 初始化系统消息（多轮对话关键）
    private void initSystemMessage() {
        chatHistory.add(ChatCompletionMessageParam.ofSystem(
                ChatCompletionSystemMessageParam.builder()
                                                .content(SYSTEM_PROMPT)
                                                .build()));
    }

    // 切换模型（如 qwen-plus / qwen-max）
    public void switchModel(String model) {
        this.currentModel = model;
    }

    public String chat(String userInput) {
        try {
            // 1. 添加用户消息到历史
            chatHistory.add(ChatCompletionMessageParam.ofUser(
                    ChatCompletionUserMessageParam.builder()
                                                  .content(userInput)
                                                  .build()));

            // 2. 构建请求（包含完整对话历史）
            ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder()
                                                                                .model(currentModel)
                                                                                .messages(chatHistory)
                                                                                .build();

            // 3. 获取响应
            String response = String.valueOf(client.chat().completions()
                                                   .create(createParams)
                                                   .choices()
                                                   .get(0)
                                                   .message()
                                                   .content());

            // 4. 添加助手回复到历史
            chatHistory.add(ChatCompletionMessageParam.ofAssistant(
                    ChatCompletionAssistantMessageParam.builder()
                                                       .content(response)
                                                       .build()));

            // 5. 业务逻辑处理
            return processBusinessLogic(response);
        }
        catch (Exception e) {
            return "系统错误: " + e.getMessage();
        }
    }

    // 业务逻辑处理（可扩展）
    private String processBusinessLogic(String response) {
        if (response.contains("立即下单")) {
            return generateOrder(response);
        }
        return response;
    }

    // 订单生成（可替换为真实支付逻辑）
    private String generateOrder(String response) {
        return response + """
                          [订单生成]
                          课程：Java零基础入门
                          价格：￥0.01
                          支付链接：https://pay.example.com/order/123
                          """;
    }

    // 测试用例
    public static void main(String[] args) {
        String apiKey = "sk-a1facdd2bd864836ae701a1f8e60cdb0";
        String baseUrl = "https://dashscope.aliyuncs.com/compatible-mode/v1";

        AICourseAssistant assistant = new AICourseAssistant(apiKey, baseUrl);

        // 模拟多轮对话
        List<String> testDialogue = List.of(
                "你好，我想学编程",
                "25岁，大专学历，零基础",
                "对Python感兴趣",
                "立即下单"
                                           );

        testDialogue.forEach(input -> {
            System.out.println("用户: " + input);
            System.out.println("助手: " + assistant.chat(input) + "\n");
        });

        // 切换模型示例
        assistant.switchModel("qwen-max");
        System.out.println("切换模型后测试: " + assistant.chat("用更详细的方式重新推荐"));
    }
}